package com.hnist.empdemo.view.component;

import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.util.Callback;

import java.util.List;

/**
 * // 假设有一个Employee类
 * List<Employee> employees = // ... 获取员工列表
 *
 * // 创建通用下拉框，显示员工姓名
 * GenericComboBox<Employee> employeeComboBox = new GenericComboBox<>(
 *     employees,
 *     employee -> employee.getName() // 定义如何显示员工信息
 * );
 *
 * // 在界面中使用
 * somePane.getChildren().add(employeeComboBox);
 * 通用下拉框组件
 * @param <T> 下拉框中元素的类型
 */
public class GenericComboBox<T> extends ComboBox<T> {

    /**
     * 创建一个通用下拉框组件
     * @param items 下拉框中的选项列表
     * @param displayFunction 用于定义如何显示每个选项的函数
     */
    public GenericComboBox(List<T> items, Callback<T, String> displayFunction) {
        super();
        this.getItems().addAll(items);
        this.setCellFactory(new Callback<ListView<T>, ListCell<T>>() {
            @Override
            public ListCell<T> call(ListView<T> param) {
                return new ListCell<T>() {
                    @Override
                    protected void updateItem(T item, boolean empty) {
                        super.updateItem(item, empty);
                        if (empty || item == null) {
                            setText(null);
                        } else {
                            setText(displayFunction.call(item));
                        }
                    }
                };
            }
        });

        this.setButtonCell(new ListCell<T>() {
            @Override
            protected void updateItem(T item, boolean empty) {
                super.updateItem(item, empty);
                if (empty || item == null) {
                    setText(null);
                } else {
                    setText(displayFunction.call(item));
                }
            }
        });
    }
}
